local blaze = require "blaze"

local M = {}
local base = blaze.coroutine
setmetatable(M, { __index = base })

local started = {} -- 所有已启动过的协程
setmetatable(started, { mode = "k" })
local ingame_started = {} -- 游戏内启动的协成

-- 游戏内启动一个协成，会缓存，方便统一释放
function M.ingame_start(f, ...)
    local ret = M.start(f, ...)

    if ret then
        ingame_started[ret] = true
    end
    
    return ret
end

-- 清理所有 ingame_start 产生的协成
function M.ingame_stop_all()
    for co, _ in pairs(ingame_started) do
        ingame_started[co] = nil
        base.stop(co)
    end
end

-- 出游戏沙箱一定会释放全部已经启动的协成
function M.start(f, ...)
    local ret = base.start(f, ...)

    if ret == nil then
        return
    end

    started[ret] = true
    return ret
end

function M.step()
    base.step();
end

function M.wait(seconds, unscale)
    base.wait(seconds, unscale);
end

function M.stop(co)
    base.stop(co)
    started[co] = nil
    if ingame_started[co] then
        ingame_started[co] = nil
    end
end

function M.release()
    for co, _ in pairs(started) do
        base.stop(co)
    end
end

return M